package linked_list

type LinkedList interface {
	Reversal(header *LinkedNode) *LinkedNode // 链表反转
	ToArray(header *LinkedNode) []int        // 链表转数组
	ToLinkedList(array []int) *LinkedNode    // 数组转链表
}

type LinkedNode struct {
	Value int
	Next  *LinkedNode
}

func NewLinkedNode(value int, next *LinkedNode) *LinkedNode {
	return &LinkedNode{
		Value: value,
		Next:  next,
	}
}

/*type LinkedList struct {
	Head *LinkedNode
	Tail *LinkedNode
	Size int
}

func NewLinkedList() *LinkedList {
	return &LinkedList{}
}
*/

func (l *LinkedNode) ToArray(header *LinkedNode) []int {
	var (
		result = make([]int, 0)
	)
	if header == nil {
		return []int{}
	}

	for header != nil {
		result = append(result, header.Value)
		header = header.Next
	}
	return result
}

func (l *LinkedNode) ToLinkedList(array []int) *LinkedNode {
	var (
		result = &LinkedNode{}
	)
	header := result
	if len(array) == 0 {
		return nil
	}
	for _, value := range array {
		header.Next = NewLinkedNode(value, nil)
		header = header.Next
	}
	return result.Next
}
